Pinvon's Blog

所见, 所闻, 所思, 所想

Hyperledger Composer

安装

前提条件

curl -O https://hyperledger.github.io/composer/latest/prereqs-ubuntu.sh
chmod u+x prereqs-ubuntu.sh
./prereqs-ubuntu.sh

安装组件

安装 CLI tools

composer-cli 是最重要的组件, 包含了基本的操作. generator-hyperledger-composer, composer-rest-server, yeoman 这三个虽然不是核心部分, 但在后面与我们自己定义的网络交互时, 可以起到作用.

npm install -g composer-cli@0.20
npm install -g composer-rest-server@0.20
npm install -g generator-hyperledger-composer@0.20
npm install -g yo

如果要卸载:

npm uninstall -g composer-cli composer-rest-server generator-hyperledger-composer

安装 Plyaground

Playground 可以为我们提供 UI 视图.

npm install -g composer-playground@0.20

安装 Hyperledger Fabric

mkdir fabric-dev-servers && cd fabric-dev-servers

curl -O https://raw.githubusercontent.com/hyperledger/composer-tools/master/packages/fabric-dev-servers/fabric-dev-servers.tar.gz
 tar -xvf fabric-dev-servers.tar.gz

cd ~/fabric-dev-servers
export FABRIC_VERSION=hlfv12
./downloadFabric.sh

这边安装的是 Hyperledger Fabric v1.2 的版本.

使用

启动和停止 Hyperledger Fabric

cd ~/fabric-dev-servers
export FABRIC_VERSION=hlfv12
./startFabric.sh
./createPeerAdminCard.sh

# 关闭
./stopFabric.sh 
./teardownFabric.sh

启动 Playground

在启动 Hyperledger Fabric 后, 运行:

composer-playground

删除当前设置

docker kill $(docker ps -q)
docker rm $(docker ps -aq)
docker rmi $(docker images dev-* -q)

Playground 教程

利用 Playground, 我们可以建立一个业务网络, 定义资产, 参与者, 交易, 并进行测试.

打开 Playground

composer-playground

创建新的业务网络

Deploy a new business network

输入名称

empty-business-network(从零开始才选择这项, 也可以基于其他网络创建)

Deploy

连接到刚部署的网络

单击 connect now

添加模型文件

(最好自己写一份上传)

单击 Model file, 并用以下代码来替换它们:

/**
 * My commodity trading network
 */
namespace org.example.mynetwork
asset Commodity identified by tradingSymbol {
    o String tradingSymbol
    o String description
    o String mainExchange
    o Double quantity
    --> Trader owner
}
participant Trader identified by tradeId {
    o String tradeId
    o String firstName
    o String lastName
}
transaction Trade {
    --> Commodity commodity
    --> Trader newOwner
}

这个模型定义了一个资产 Commodity, 一个参与者 Trader, 一个交易 Trade.

添加处理逻辑

Composer 使用 JavaScript 来表达业务网络的逻辑, 提交事务进行处理时, 将自动执行这些功能.

Add a file -> Script file -> Add

用以下代码来替换:

/**
 * Track the trade of a commodity from one trader to another
 * @param {org.example.mynetwork.Trade} trade - the trade to be processed
 * @transaction
 */
async function tradeCommodity(trade) {
    trade.commodity.owner = trade.newOwner;
    let assetRegistry = await getAssetRegistry('org.example.mynetwork.Commodity');
    await assetRegistry.update(trade.commodity);
}

这段代码使用新的所有者 trade.newOwner 来替换原有的所有者 trade.commodity.owner, 然后将修改后的 trade.commodity 保存.

访问控制

这个例子中的网络很简单, 因此不需要修改默认的访问控制.

部署和更新业务网络

单击左下角的 Deploy changes.

测试

添加资产

单击 Test 导航栏.

添加两个参与者.

单击 Trader -> Create New Participant, 用以下代码来替换, 然后单击 Create new.

{
  "$class": "org.example.mynetwork.Trader",
  "tradeId": "TRADER1",
  "firstName": "Jenny",
  "lastName": "Jones"
}

创建第二个参与者:

{
  "$class": "org.example.mynetwork.Trader",
  "tradeId": "TRADER2",
  "firstName": "Amy",
  "lastName": "Williams"
}

添加参与者

Commodity -> Assets -> Create New Asset

使用以下代码替换:

{
  "$class": "org.example.mynetwork.Commodity",
  "tradingSymbol": "ABC",
  "description": "Test commodity",
  "mainExchange": "Euronext",
  "quantity": 72.297,
  "owner": "resource:org.example.mynetwork.Trader#TRADER1"
}

在两个参与者之间转移资产

Submit Transaction, 用以下代码替换:

{
  "$class": "org.example.mynetwork.Trade",
  "commodity": "resource:org.example.mynetwork.Commodity#ABC",
  "newOwner": "resource:org.example.mynetwork.Trader#TRADER2"
}

Submit -> All Transactions

基于已有 Fabric 创建业务网络

如果已有 Fabric, 那么我们已经有了 PeerAdmin 和 ChannelAdmin, 在部署之前, 需要再填写一些其他字段.

要提供网络管理员的凭证时, 我们应该填写: Enrollment ID, admin Enrollment Secret, adminpw

使用命令的方式创建业务网络

配置环境

export FABRIC_VERSION=hlfv12
./startFabric.sh
./createPeerAdminCard.sh

创建网络结构

yo hyperledger-composer:businessnetwork

按照提示, 输入网络名字等信息, 其中, namespace 输入 org.example.mynetwork, generate an empty template network 中, 选择 No.

定义网络

使用以下代码代替 org.example.mynetwork.cto 文件里的内容:

/**
 * My commodity trading network
 */
namespace org.example.mynetwork
asset Commodity identified by tradingSymbol {
    o String tradingSymbol
    o String description
    o String mainExchange
    o Double quantity
    --> Trader owner
}
participant Trader identified by tradeId {
    o String tradeId
    o String firstName
    o String lastName
}
transaction Trade {
    --> Commodity commodity
    --> Trader newOwner
}

我们使用 JavaScript 来执行 .cto 文件中定义的交易. 将 lib/logic.js 中的内容替换如下:

/**
 * Track the trade of a commodity from one trader to another
 * @param {org.example.mynetwork.Trade} trade - the trade to be processed
 * @transaction
 */
async function tradeCommodity(trade) {
    trade.commodity.owner = trade.newOwner;
    let assetRegistry = await getAssetRegistry('org.example.mynetwork.Commodity');
    await assetRegistry.update(trade.commodity);
}

使用以下代码替换 permissions.acl 中的内容:

/**
 * Access control rules for tutorial-network
 */
rule Default {
    description: "Allow all participants access to all resources"
    participant: "ANY"
    operation: ALL
    resource: "org.example.mynetwork.*"
    action: ALLOW
}

rule SystemACL {
  description:  "System ACL to permit all access"
  participant: "ANY"
  operation: ALL
  resource: "org.hyperledger.composer.system.**"
  action: ALLOW
}

生成网络

进入 tutorial-network 目录, 执行命令:

composer archive create -t dir -n .

将会在当前目录生成一个 .bna 文件.

部署业务网络

一般来说, Fabric 管理员需要创建一个 PeerAdmin 身份, 来执行安装链码和启动链码的命令, 不过在这边, Composer 已经自动为我们创建好了.

部署网络, 启动网络:

composer network install --card PeerAdmin@hlfv1 --archiveFile tutorial-network@0.0.1.bna

composer network start --networkName tutorial-network --networkVersion 0.0.1 --networkAdmin admin --networkAdminEnrollSecret adminpw --card PeerAdmin@hlfv1 --file networkadmin.card

为了顺利使用这个网络, 需要将 .card 文件导入.

composer card import --file networkadmin.card

测试是否部署成功:

composer network ping --card admin@tutorial-network

生成 REST 服务

composer-rest-server

然后输入名字: admin@tutorial-network

use namespaces in the generated API: never use namespaces

secure the generated API: No

enable event publication: Yes

是否开启 TLS: No

生成应用程序

再开一个终端, 进入 tutorial-network

yo hyperledger-composer:angular

使用 Composer 为单个 Org 部署业务网络

启动 Hyperledger Fabric Network

cd ~/fabric-dev-servers
export FABRIC_VERSION=hlfv12
./stopFabric.sh
./teardownFabric.sh
./downloadFabric.sh
./startFabric.sh

composer card delete -c PeerAdmin@fabric-network
composer card delete -c admin@tutorial-network

# 如果上面的删除命令失败了, 则索性把整个文件删除
rm -fr ~/.composer

创建 .bna 文件

根据前面"使用命令的方式创建业务网络"介绍的内容, 创建 .bna 文件.

创建 connection.json

编辑 connection.json

{
    "name": "fabric-network",
    "x-type": "hlfv1",
    "version": "1.0.0",
    "peers": {
        "peer0.org1.example.com": {
            "url": "grpc://localhost:7051"
        }
    },
    "certificateAuthorities": {
        "ca.org1.example.com": {
            "url": "http://localhost:7054",
            "caName": "ca.org1.example.com"
        }
    },
    "orderers": {
        "orderer.example.com": {
            "url": "grpc://localhost:7050"
        }
    },
    "organizations": {
        "Org1": {
            "mspid": "Org1MSP",
            "peers": [
                "peer0.org1.example.com"
            ],
            "certificateAuthorities": [
                "ca.org1.example.com"
            ]
        }
    },
    "channels": {
        "composerchannel": {
            "orderers": [
                "orderer.example.com"
            ],
            "peers": {
                "peer0.org1.example.com": {
                    "endorsingPeer": true,
                    "chaincodeQuery": true,
                    "eventSource": true
                }
            }
        }
    },
    "client": {
        "organization": "Org1",
        "connection": {
            "timeout": {
                "peer": {
                    "endorser": "300",
                    "eventHub": "300",
                    "eventReg": "300"
                },
                "orderer": "300"
            }
        }
    }
}

创建业务网卡

业务网卡包含连接到业务网络和 Fabric 网络所需的所有信息. 使用 composer card create 来创建业务网卡.

composer card create -p connection.json -u PeerAdmin -c Admin@org1.example.com-cert.pem -k 114aab0e76bf0c78308f89efc4b8c9423e31568da0c340ca187a9b17aa9a4457_sk -r PeerAdmin -r ChannelAdmin

-p connection.json: 填写指向 connection.json 的路径.

-u PeerAdmin: 指定管理员的名称.

-c Admin@org1.example.com-cert.pem: 填写指向证书文件的路径, 路径为 fabric-dev-servers/fabric-scripts/hlfv11/composer/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp

-k 114aab0e76bf0c78308f89efc4b8c9423e31568da0c340ca187a9b17aa9a4457_sk: 填写私钥文件路径, 存储在 keystore 里

完整的命令类似如下:

composer card create -p connection.json -u PeerAdmin -c ../fabric-scripts/hlfv11/composer/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp/signcerts/Admin@org1.example.com-cert.pem -k ../fabric-scripts/hlfv11/composer/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp/keystore/114aab0e76bf0c78308f89efc4b8c9423e31568da0c340ca187a9b17aa9a4457_sk -r PeerAdmin -r ChannelAdmin

这条命令会输出 .card 文件到当前目录.

将业务网卡导入给 Fabric 管理员

composer card import -f PeerAdmin@fabric-network.card

将业务网络安装到节点上

可以将这一步理解为在 Fabric 中的安装链码.

composer network install -c PeerAdmin@fabric-network -a tutorial-network@0.0.1.bna

将 card 文件导入到业务网络

composer card import -f admin@tutorial-network.card

测试

composer network ping -c admin@tutorial-network

Comments

使用 Disqus 评论
comments powered by Disqus